package com.correo.socket.server;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.security.NoSuchAlgorithmException;
import java.sql.Date;
import java.sql.SQLException;
import java.util.Calendar;

import com.correo.database.beans.SessionBean;
import com.correo.database.server.ManagerDataBase;
import com.correo.socket.client.beans.LoginBean;
import com.correo.socket.client.beans.ResponseLogin;
import com.correo.socket.client.beans.UsuarioValidado;
import com.correo.socket.ecriptar.ManagerMD5;

public class ServerSocketAdmin implements Runnable{
	private Socket socket;
	private ObjectOutputStream oos;
	private ObjectInputStream ois;
	
	public ServerSocketAdmin(Socket socket){
		this.socket = socket;
	}
	public void run() {
		LoginBean login = new LoginBean();
		try 
		{
			oos = new ObjectOutputStream(socket.getOutputStream());
			ois = new ObjectInputStream(socket.getInputStream());
			/*Grabo*//*
			msg.setTipoMensaje(0);
			msg.setMensaje("" + socket.getInetAddress() + " Port " + socket.getLocalPort());
			oos.writeObject(msg);
			*/
			/*Leo*/
			login = (LoginBean) ois.readObject();
			System.out.println("usuario : "+login.getUsuario()+"; Password : "+login.getPassword());
			if(verificarUsuarioPassword(login)){
				/*Grabo*/
				String challenge=ManagerMD5.convertir( Calendar.getInstance().getTimeInMillis()+""+
						login.getUsuario()+""+
						login.getPassword());
				login.setChallenge(challenge);
				//msg.setMensaje("Recibido el Segundo Mensaje");
				oos.writeObject(login);
				ResponseLogin response;
				response = (ResponseLogin) ois.readObject();
				System.out.println(" Response :"+response.getChallenge());
				//msg.setMensaje("Recibido el Segundo Mensaje");
				//validarSessionesAntiguas(response.getChallenge());
				UsuarioValidado user = ValidarSession(response.getChallenge(),login,challenge);
				if (user != null)
				{
					oos.writeObject(user);
					try {
						ManagerDataBase.getInstance().getMngUserDataBase().cambiarEstadoLogin(login.getUsuario(), true);
					} catch (SQLException e) {					
						e.printStackTrace();
					}
				}
				else
				{
					login.setMsgError("Login error");
					oos.writeObject(login);
					try {
						ManagerDataBase.getInstance().getMngUserDataBase().cambiarEstadoLogin(login.getUsuario(), false);
					} catch (SQLException e) {					
						e.printStackTrace();
					}
				}
			}else{
				/*Grabo*/
				login.setMsgError("Login error");
				oos.writeObject(login);
				try {
					ManagerDataBase.getInstance().getMngUserDataBase().cambiarEstadoLogin(login.getUsuario(), false);
				} catch (SQLException e) {					
					e.printStackTrace();
				}
				
				
			}
			oos.close();
			ois.close();
			/*Leo*/
			//msg = (LoginBean) ois.readObject();
			//System.out.println(msg.getMensaje());
		} 
		catch (IOException e) 
		{	
			e.printStackTrace();
		} 
		catch (ClassNotFoundException e) 
		{
			e.printStackTrace();
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	private UsuarioValidado ValidarSession(String challengeResponse, LoginBean login, String challengeOriginal) throws NoSuchAlgorithmException, UnsupportedEncodingException {
		if (!validarSessionesAntiguas(challengeResponse))
		{
		String challenge = ManagerMD5.convertir(login.getChallenge()+login.getFechaActual()+login.getPassword());
		if(challenge.equals(challengeResponse)){
			SessionBean session =new SessionBean(challengeResponse,login.getUsuario(),socket.getInetAddress().getHostAddress(),new Date(Calendar.getInstance().getTimeInMillis()));
			try {
				ManagerDataBase.getInstance().getMngUserDataBase().altaSession(session);
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
			UsuarioValidado usuarioValidado = new UsuarioValidado();
			usuarioValidado.setNonce1( Calendar.getInstance().getTimeInMillis());
			usuarioValidado.setCadenaconeccion("jdbc:sqlserver://localhost");
			usuarioValidado.setUserName(login.getUsuario());
			usuarioValidado.setPassword(login.getPassword());
			return usuarioValidado;
		}
		}
		return null;
	}
	private boolean validarSessionesAntiguas(String challenge) {
		try {
			return ManagerDataBase.getInstance().getMngUserDataBase().verificarSessionesAnteriores(challenge);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
		
	}
	private boolean verificarUsuarioPassword(LoginBean login) {
	 try {
		return	ManagerDataBase.getInstance().getMngUserDataBase().verificarUsuario(login);
	} catch (ClassNotFoundException e) {		
		e.printStackTrace();
	} catch (SQLException e) {		
		e.printStackTrace();
	}
	return false;
	}

	
	
}
